package controller

import (
	"Library_Management_System/API"
	"Library_Management_System/model"
	"html/template"
	"net/http"
	"strconv"
)

// Login 用户登录函数
func Login(w http.ResponseWriter, r *http.Request) {
	// 获取信息
	username := r.FormValue("username")
	password := r.FormValue("password")
	email := r.FormValue("email")
	// 检查信息
	user, err := API.CheckUserLogin(username, password, email)
	if err != nil {
		// 登录失败
		t := template.Must(template.ParseFiles("views/pages/login.html"))
		err := t.Execute(w, "")
		if err != nil {
			panic(err.Error())
		}
	} else {
		books, err := API.GetAllBooks()
		if err != nil {
			panic(err.Error())
		}
		// 登录成功
		if user.IsAdmin {
			// 管理员页面
			pageData := &model.PageData{
				User:  user,
				Books: books,
			}
			t := template.Must(template.ParseFiles("views/pages/index_admin.html"))
			err := t.Execute(w, pageData)
			if err != nil {
				panic(err.Error())
			}
		} else {
			// 普通用户页面
			pageData := &model.PageData{
				User:  user,
				Books: books,
			}
			t := template.Must(template.ParseFiles("views/pages/index_user.html"))
			err = t.Execute(w, pageData)
			if err != nil {
				panic(err.Error())
			}
		}
	}
}

// Register 用户注册函数
func Register(w http.ResponseWriter, r *http.Request) {
	// 获取信息
	username := r.FormValue("username")
	password := r.FormValue("password")
	email := r.FormValue("email")
	isAdmin, err := strconv.ParseBool(r.FormValue("isAdmin"))
	if err != nil {
		panic(err.Error())
	}
	err = API.Register(username, password, email, isAdmin)
	if err != nil {
		panic(err.Error())
	}
	// 回到登录界面
	t := template.Must(template.ParseFiles("views/pages/login.html"))
	err = t.Execute(w, "")
	if err != nil {
		panic(err.Error())
	}
}

// CheckUsername 检查用户名是否重复
func CheckUsername(w http.ResponseWriter, r *http.Request) {
	// 获取信息
	username := r.FormValue("username")
	// 获取查询结果，响应回去
	isDuplicate := API.CheckUsername(username)
	if isDuplicate {
		// 重复
		_, err := w.Write([]byte("true"))
		if err != nil {
			panic(err.Error())
		}
	} else {
		// 不重复
		_, err := w.Write([]byte("false"))
		if err != nil {
			panic(err.Error())
		}
	}
}

// GetUserInfo 转到用户信息页面
func GetUserInfo(w http.ResponseWriter, r *http.Request) {
	t, err := template.ParseFiles("views/pages/pageUser_info.html")
	if err != nil {
		panic(err.Error())
	}
	// 根据用户ID获取用户对象和用户借阅信息
	userID := r.URL.Query().Get("UserID")
	// 用户结构
	user, err := API.GetUserByID(userID)
	if err != nil {
		panic(err.Error())
	}
	// 用户借阅信息
	borrowInfos, err := API.GetBorrowInfo(userID)
	if err != nil {
		panic(err.Error())
	}
	pageData := &model.PageData{
		User:        user,
		BorrowInfos: borrowInfos,
	}

	err = t.Execute(w, pageData)
	if err != nil {
		panic(err.Error())
	}
}

// UpdateBorrowInfo 用户借阅图书
func UpdateBorrowInfo(w http.ResponseWriter, r *http.Request) {
	// 获取信息
	userID := r.PostFormValue("userID")
	bookID := r.PostFormValue("bookID")
	bookName := r.PostFormValue("bookName")
	borrowDate := r.PostFormValue("borrowTime")
	returnDate := r.PostFormValue("returnTime")
	// 更新借阅信息
	err := API.UpdateBorrowInfo(userID, bookID, bookName, borrowDate, returnDate)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	GetUserBook(w, r)
}

// ReturnBook 用户归还图书
func ReturnBook(w http.ResponseWriter, r *http.Request) {
	// 获取信息
	userID := r.PostFormValue("userID")
	bookName := r.PostFormValue("bookName")
	// 根据userID和bookName删除借阅信息
	err := API.DeleteBorrowInfo(userID, bookName)
	if err != nil {
		panic(err.Error())
	}
}

// AddBook 添加图书
func AddBook(w http.ResponseWriter, r *http.Request) {
	// 获取信息
	title := r.FormValue("title")
	author := r.FormValue("author")
	price := r.FormValue("price")
	quantity := r.FormValue("quantity")

	priceFloat, err := strconv.ParseFloat(price, 64)
	if err != nil {
		panic(err)
	}
	quantityInt, err := strconv.ParseInt(quantity, 10, 32)
	if err != nil {
		panic(err)
	}
	// 调用函数
	err = API.AddBook(title, author, priceFloat, int(quantityInt))
	if err != nil {
		panic(err)
	}

	// 重新调用图书管理页面
	GetAdminBook(w, r)
}

// ModifyBook 修改图书
func ModifyBook(w http.ResponseWriter, r *http.Request) {
	// 获取图书信息
	bookID := r.PostFormValue("id")
	title := r.PostFormValue("title")
	author := r.PostFormValue("author")
	price := r.PostFormValue("price")
	quantity := r.PostFormValue("quantity")

	priceFloat, err := strconv.ParseFloat(price, 64)
	if err != nil {
		panic(err)
	}
	quantityInt, err := strconv.ParseInt(quantity, 10, 32)
	if err != nil {
		panic(err)
	}
	// 调用函数
	err = API.ModifyBook(bookID, title, author, priceFloat, int(quantityInt))
	if err != nil {
		panic(err)
	}

	// 重新调用图书管理页面
	GetAdminBook(w, r)
}

// DeleteBook 删除图书
func DeleteBook(w http.ResponseWriter, r *http.Request) {
	// 获取图书信息
	bookID := r.PostFormValue("id")
	// 调用函数
	err := API.DeleteBook(bookID)
	if err != nil {
		panic(err)
	}

	// 重新调用图书管理页面
	GetAdminBook(w, r)
}

// DisableUser 禁用用户
func DisableUser(w http.ResponseWriter, r *http.Request) {
	// 获取用户信息
	userID := r.PostFormValue("userID")
	// 调用函数
	err := API.DisableUser(userID)
	if err != nil {
		panic(err)
	}
}
